package com.thread.test20190330.part1.threadlifecycle04;

/**
 *
 * 线程的生命周期
 *
 * A->new 创建状态 此时并不会立即执行
 * B->runnable 就绪状态 此时可能并不会立即执行 等待cpu调度 可进入C E
 * C->running 运行状态 可进入B D E
 * D->blocked 阻塞状态 可进入B E
 * E->dead 死亡状态
 *
 *
 * 调用start实际上是两个线程在并发执行
 * 一个就是运行run方法的线程-就是你自己的线程
 * 第二个就是调用你线程的线程-就是main线程
 * 不能对同一个线程对象start两次
 *
 * 直接使用线程对象的run方法并不会启动多线程，而是由main方法直接调用
 *
 * start方法执行步骤
 * A-> 检查线程状态threadStatus是否为0 就是新建状态，否则抛出IllegalThreadStateException
 * B-> 当前线程加入线程组ThreadGroup （数组类型为Thread）
 * C-> 调用 native 方法 start0() 调用run方法
 * 如果运行正常 设置started为true
 * 如果运行失败 线程组移除该线程
 *
 * start方法 通过模板方法来进行调用，设计十分巧妙
 *
 *
 * @Description: ThreadLifeCycle
 * @author: conceit
 * @Date: 2019/3/30 18:53
 */
public class ThreadLifeCycle {


    public final void start(String message){
        System.out.println("start-->start");
        run(message);
        System.out.println("start-->end");
    }

    //其他包不能使用
    protected void run(String message){

    }

    public static void main(String[] args) {

        ThreadLifeCycle t1=new ThreadLifeCycle(){
            //匿名内部类
            @Override
            protected void run(String messag){

            }
        };
        t1.start("t1");



    }

}
